Comment puis-je me débarrasser de Nans en Matlab?
Question
J'ai des fichiers qui ont beaucoup de cellules vides qui apparaissent comme NaN quand je l'utilise cell2mat
, mais le problème est quand j'ai besoin pour obtenir les valeurs moyennes, je ne peux pas travailler avec cela comme il montre l'erreur avec NaN. Dans Excel, il donne des valeurs NaN, alors comment puis-je faire la même chose dans Matlab?
De plus, je suis en train d'écrire un fichier en utilisant xlswrite
:
xlswrite('test.xls',M);
J'ai données dans toutes les lignes sauf 1. Comment puis-je écrire:
M(1,:) = ('time', 'count', 'length', 'width')
En d'autres termes, je veux M(1,1)='time'
, M(1,2)='count'
, et ainsi de suite. J'ai des données de M(2,1)
à M(10,20)
. Comment puis-je faire?
La solution
Utilisez la fonction « isfinite » pour se débarrasser de tous NaN et infinités
A = A (isfinite (A))
% créer la matrice de cellules contenant les en-têtes de colonne ColumnHeader = { 'Colonne 1', 'Colonne 2', 'colonne 3', 'Colonne 4', 'colonne 5', » « };
% écrire les en-têtes de colonne premier xlsEcriture ( 'myFile1.xls', ColumnHeader);
% écrire les données directement sous les en-têtes de colonne xlsEcriture ( 'newFile.xls', M, 'Sheet1', 'A2');
Autres conseils
Comme AP souligne à juste titre , vous pouvez utiliser la fonction isfinite
pour trouver et conserver uniquement des valeurs finies dans votre matrice. Vous pouvez également utiliser la fonction isnan
. Toutefois, la suppression des valeurs de votre matrice peut avoir pour conséquence inattendue de remodeler votre matrice dans un vecteur de ligne ou de colonne:
>> mat = [1 2 3; 4 NaN 6; 7 8 9] % A sample 3-by-3 matrix
mat =
1 2 3
4 NaN 6
7 8 9
>> mat = mat(~isnan(mat)) % Removing the NaN gives you an 8-by-1 vector
mat =
1
4
7
2
8
3
6
9
Une autre alternative est d'utiliser certaines fonctions du Statistics Toolbox (si vous avez accès) qui sont conçus pour traiter avec des matrices contenant NaN valeurs . Puisque vous évoquez en prenant la moyenne, vous pouvez consulter nanmean
:
>> mat = [1 2 3; 4 NaN 6; 7 8 9];
>> nanmean(mat)
ans =
4 5 6 % The column means computed by ignoring NaN values
EDIT: Pour répondre à votre question supplémentaire sur l'utilisation de xlswrite
, cet exemple de code devrait illustrer une façon que vous pouvez écrire vos données:
C = {'time','count','length','width'}; % A cell array of strings
M = rand(10,20); % A 10-by-20 array of random values
xlswrite('test.xls',C); % Writes C to cells A1 through D1
xlswrite('test.xls',M,'A2:T11'); % Writes M to cells A2 through T11
Statistics Toolbox a plusieurs fonctions statistiques pour traiter les valeurs NaN. Voir nanmean, nanmedian, nanstd, nanmin, nanmax, etc.
Vous pouvez définir NaN de un nombre arbitraire comme ceci:
mat(isnan(mat))=7 // my lucky number of choice.
Peut-être trop tard, mais ...
x = [1 2 3; 4 inf 6; 7 -inf NaN];
x(find(x == inf)) = 0; //for inf
x(find(x == -inf)) = 0; //for -inf
x(find(isnan(x))) = 0; //for NaN